home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / FFPFPA.SA < prev    next >
Text File  |  1989-08-30  |  10KB  |  204 lines

  1.          TTL       FAST FLOATING POINT FLOAT TO ASCII (FFPFPA)
  2. *********************************************
  3. * (C) COPYRIGHT 1980, 1983 BY MOTOROLA INC. *
  4. *********************************************
  5.  
  6. *******************************************************
  7. *                     FFPFPA                          *
  8. *                 FLOAT TO ASCII                      *
  9. *                                                     *
  10. *    INPUT:  D7 - FLOATING POINT NUMBER               *
  11. *                                                     *
  12. *    OUTPUT: D7 - THE BASE TEN EXPONENT IN BINARY     *
  13. *                 FOR THE RETURNED FORMAT             *
  14. *            SP - DECREMENTED BY 14 AND               *
  15. *                 POINTING TO THE CONVERTED           *
  16. *                 NUMBER IN ASCII FORMAT              *
  17. *                                                     *
  18. *            ALL OTHER REGISTERS UNAFFECTED           *
  19. *                                                     *
  20. *    CONDITION CODES:                                 *
  21. *            N - SET IF THE RESULT IS NEGATIVE        *
  22. *            Z - SET IF THE RESULT IS ZERO            *
  23. *            V - CLEARED                              *
  24. *            C - CLEARED                              *
  25. *            X - UNDEFINED                            *
  26. *                                                     *
  27. *   CODE SIZE: 192 BYTES   STACK WORK AREA: 42 BYTES  *
  28. *                                                     *
  29. *                                                     *
  30. *            {S}{'.'}{DDDDDDDD}{'E'}{S}{DD}           *
  31. *            <     FRACTION   >< EXPONENT >           *
  32. *                                                     *
  33. *        WHERE  S - SIGN OF MANTISSA OR EXPONENT      *
  34. *                   ('+' OR '-')                      *
  35. *               D - DECIMAL DIGIT                     *
  36. *                                                     *
  37. *        STACK OFFSET OF RESULT  S.DDDDDDDDESDD       *
  38. *        AFTER RETURN            00000000001111       *
  39. *                                01234567890123       *
  40. *                                                     *
  41. *                                                     *
  42. *        EXAMPLES   +.12000000E+03  120               *
  43. *                   +.31415927E+01  PI                *
  44. *                   +.10000000E-01  ONE-HUNDREDTH     *
  45. *                   -.12000000E+03  MINUS 120         *
  46. *                                                     *
  47. *     NOTES:                                          *
  48. *       1) THE BINARY BASE 10 EXPONENT IS RETURNED    *
  49. *          IN D7 TO FACILITATE CONVERSIONS TO         *
  50. *          OTHER FORMATS.                             *
  51. *       2) EVEN THOUGH EIGHT DIGITS ARE RETURNED, THE *
  52. *          PRECISION AVAILABLE IS ONLY 7.167 DIGITS.  *
  53. *          ROUNDING SHOULD BE PERFORMED WHEN LESS     *
  54. *          THAN EIGHT DIGITS ARE ACTUALLY UTILIZED    *
  55. *          IN THE MANTISSA.                           *
  56. *       3) THE STACK IS LOWERED BY 14 BYTES BY THIS   *
  57. *          ROUTINE.  THE RETURN ADDRESS TO THE CALLER *
  58. *          IS REPLACED BY A PORTION OF THE RESULTS.   *
  59. *                                                     *
  60. *  TIME: (8MHZ NO WAIT STATES ASSUMED)                *
  61. *        330 MICROSECONDS CONVERTING THE SAMPLE FLOAT *
  62. *        VALUE OF 55.55 TO ASCII.                     *
  63. *                                                     *
  64. *******************************************************
  65.          PAGE
  66. FFPFPA   IDNT      1,1  FFP FLOAT TO ASCII
  67.          OPT       PCS
  68.  
  69.          SECTION    9
  70.  
  71.          XDEF      FFPFPA    ENTRY POINT
  72.          XREF       9:FFP10TBL,FFPCPYRT  POWER OF TEN TABLE
  73.  
  74. * STACK DEFINITION
  75. STKOLD   EQU       48       PREVIOUS CALLERS STACK POINTER
  76. STKEXP   EQU       46       EXPONENT
  77. STKEXPS  EQU       45       EXPONENTS SIGN
  78. STKLTRE  EQU       44       'E'
  79. STKMANT  EQU       36       MANTISSA
  80. STKPER   EQU       35       '.'
  81. STKMANS  EQU       34       MANTISSA'S SIGN
  82. STKNEWRT EQU       30       NEW RETURN POSITION
  83. STKRTCC  EQU       28       RETURN CONDITION CODE
  84. STKSAVE  EQU       0         REGISTER SAVE AREA
  85.  
  86.  
  87. FFPFPA   LEA       -10(SP),SP SET STACK TO NEW LOCATION
  88.          MOVE.L    10(SP),-(SP)   SAVE RETURN
  89.          TST.B     D7        TEST VALUE
  90.  
  91. ***  BEGIN 68010 COMPATIBILITY CHANGES  ***
  92.  
  93.          SUBA.W   #2,A7      CLEAR SPOT FOR CCR
  94.          MOVEM.L  D0,-(SP)   PUSH D0 ON STACK
  95.          SF       D0         CLR.B D0 W/O CHANGING CCR
  96.          BNE.S    CCZ        CHECK Z BIT,BRANCH IF CLR
  97.          BSET     #6,D0      SET BIT 6 TO 1 FOR Z BIT
  98. CCZ      BCC.S    CCC        CHECK C BIT,BRANCH IF CLR
  99.          BSET     #4,D0      SET BIT 4 TO 1 FOR C BIT
  100. CCC      BVC.S    CCV        CHECK V BIT,BRANCH IF CLR
  101.          BSET     #5,D0      SET BIT 5 TO 1 FOR V BIT
  102. CCV      BPL.S    CCN        CHECK N BIT,BRANCH IF CLR
  103.          BSET     #7,D0      SET BIT 7 TO 1 FOR N BIT
  104. CCN      ROXR.B   #4,D0      ROTATE X BIT IN
  105.          AND.W    #$1F,D0    CLEAR UPPER BYTE
  106.          MOVE.W   D0,4(SP)   SAVE CCR OF RESULT ON THE STACK
  107.          MOVE.L   (SP)+,D0   RESTORE OLD D0 VALUE
  108.  
  109. ***  END 68010 COMPATIBILITY CHANGES  ***
  110.  
  111.          MOVEM.L   D2-D6/A0/A1,-(SP)  SAVE WORK ADDRESS REGISTER
  112.  
  113. * ADJUST FOR ZERO VALUE
  114.          BNE.S     FPFNOT0   BRANCH NO ZERO INPUT
  115.          MOVE.L    #$41,D7   SETUP PSUEDO INTEGER EXPONENT
  116.  
  117. * SETUP MANTISSA'S SIGN
  118. FPFNOT0  MOVE.W    #'+.',STKMANS(SP) INSERT PLUS AND DECIMAL
  119.          MOVE.B    D7,D6     COPY SIGN+EXPONENT
  120.          BPL.S     FPFPLS    BRANCH IF PLUS
  121.          ADD.B     #2,STKMANS(SP) CHANGE PLUS TO MINUS
  122.  
  123. * START SEARCH FOR MAGNITUDE IN BASE 10 POWER TABLE
  124. FPFPLS   ADD.B     D6,D6     SIGN OUT OF PICTURE
  125.          MOVE.B    #$80,D7   SET ROUDING FACTOR FOR SEARCH
  126.          EOR.B     D7,D6     CONVERT EXPONENT TO BINARY
  127.          EXT.W     D6        EXPONENT TO WORD
  128.          ASR.W     #1,D6     BACK FROM SIGN EXTRACTMENT
  129.          MOVE.L    #1,D3     START BASE TEN COMPUTATION
  130.          LEA       FFP10TBL,A0 START AT TEN TO THE ZERO
  131.          CMP.W     (A0),D6   COMPARE TO TABLE
  132.          BLT.S     FPFMIN    BRANCH MINUS EXPONENT
  133.          BGT.S     FPFPLU    BRANCH PLUS EXPONENT
  134. FPFEQE   CMP.L     2(A0),D7  EQUAL SO COMPARE MANTISSA'S
  135.          BCC.S     FPFFND    BRANCH IF INPUT GREATER OR EQUAL THAN TABLE
  136. FPFBCK   ADD.W     #6,A0     TO NEXT LOWER ENTRY IN TABLE
  137.          SUB.W     #1,D3     DECREMENT BASE 10 EXPONENT
  138.          BRA.S     FPFFND    BRANCH POWER OF TEN FOUND
  139.  
  140. * EXPONENT IS HIGHER THAN TABLE
  141. FPFPLU   LEA       -6(A0),A0 TO NEXT HIGHER ENTRY
  142.          ADD.W     #1,D3     INCREMENT POWER OF TEN
  143.          CMP.W     (A0),D6   TEST NEW MAGNITUDE
  144.          BGT.S     FPFPLU    LOOP IF STILL GREATER
  145.          BEQ.S     FPFEQE    BRANCH EQUAL EXPONENT
  146.          BRA.S     FPFBCK    BACK TO LOWER AND FOUND
  147.  
  148. * EXPONENT IS LOWER THAN TABLE
  149. FPFMIN   LEA       6(A0),A0  TO NEXT LOWER ENTRY
  150.          SUB.W     #1,D3     DECREMENT POWER OF TEN BY ONE
  151.          CMP.W     (A0),D6   TEST NEW MAGNITUDE
  152.          BLT.S     FPFMIN    LOOP IF STILL LESS THAN
  153.          BEQ.S     FPFEQE    BRANCH EQUAL EXPONENT
  154.  
  155. * CONVERT THE EXPONENT TO ASCII
  156. FPFFND   MOVE.L    #'E+00',STKLTRE(SP) SETUP EXPONENT PATTERN
  157.          MOVE.W    D3,D2     ? EXPONENT POSITIVE
  158.          BPL.S     FPFPEX    BRANCH IF SO
  159.          NEG.W     D2        ABSOLUTIZE
  160.          ADD.B     #2,STKEXPS(SP) TURN TO MINUS SIGN
  161. FPFPEX   CMP.W     #10,D2    ? TEN OR GREATER
  162.          BCS.S     FPFGEN    BRANCH IF NOT
  163.          ADD.B     #1,STKEXP(SP) CHANGE ZERO TO A ONE
  164.          SUB.W     #10,D2    ADJUST TO DECIMAL
  165. FPFGEN   OR.B      D2,STKEXP+1(SP) FILL IN LOW DIGIT
  166.  
  167. * GENERATE THE MANTISSA IN ASCII A0->TABLE  D7=BINARY MANTISSA
  168. * D5 - MANTISSA FROM TABLE       D6.W = BINARY EXPONENT
  169. * D4 - SHIFT AND DIGIT BUILDER   D2 = DBRA MANTISSA DIGIT COUNT
  170. * A1->MANTISSA STACK POSITION
  171.          MOVE.L    #7,D2     COUNT FOR EIGHT DIGITS
  172.          LEA       STKMANT(SP),A1 POINT TO MANTISSA START
  173.          TST.L     D7        ? ZERO TO CONVERT
  174.          BPL.S     FPFZRO    BRANCH IF SO TO NOT ROUND
  175.          TST.B     5(A0)     ? 24 BIT PRECISE IN TABLE
  176.          BNE.S     FPFNXI    BRANCH IF NO TRAILING ZEROES
  177. FPFZRO   CLR.B     D7        CLEAR ADJUSTMENT FOR .5 LSB PRECISION
  178. FPFNXI   MOVE.W    D6,D4     COPY BINARY EXPONENT
  179.          SUB.W     (A0)+,D4  FIND NORMALIZATION FACTOR
  180.          MOVE.L    (A0)+,D5  LOAD MANTISSA FROM TABLE
  181.          LSR.L     D4,D5     ADJUST TO SAME EXPONENT
  182.          MOVE.L    #9,D4     START AT NINE AND COUNT DOWN
  183. FPFINC   SUB.L     D5,D7     SUBTRACT FOR ANOTHER COUNT
  184.          DBCS      D4,FPFINC DECREMENT AND BRANCH IF OVER
  185.          BCS.S     FPFNIM    BRANCH NO IMPRECISION
  186.          CLR.B     D4        CORRECT RARE UNDERFLOW DUE TO TABLE IMPRECISION
  187. FPFNIM   ADD.L     D5,D7     MAKE UP FOR OVER SUBTRACTION
  188.          SUB.B     #9,D4     CORRECT VALUE
  189.          NEG.B     D4        TO BETWEEN 0 AND 9 BINARY
  190.          OR.B      #'0',D4   CONVERT TO ASCII
  191.          MOVE.B    D4,(A1)+  INSERT INTO ASCII MANTISSA PATTERN
  192.          DBRA      D2,FPFNXI BRANCH IF MORE DIGITS TO GO
  193.  
  194. * RETURN WITH BASE TEN EXPONENT BINARY IN D7
  195.          MOVE.W    D3,D7     TO D7
  196.          EXT.L     D7        TO FULL WORD
  197.          MOVEM.L   (SP)+,D2-D6/A0/A1 RESTORE WORK REGISTERS
  198.          RTR       RETURN WITH PROPER CONDITION CODE
  199.  
  200.  
  201.          END
  202.  
  203.  
  204.